<?php

require_once '../../ConfigurationFactory.php';
require_once APP_PERSISTENCE.'/dao/DaoFactory.php';

class DaoFactoryCreateQuery {


    protected  function splitAndCombineAtUpperCase($field){

        $column = preg_replace('/([a-z0-9])?([A-Z])/','$1_$2',$field);

        return strtolower($column);

    }

    protected  function splitAndCombineAtUnderscore($field){
        $entity = "";

        $columnArray = explode("_", $field);
        for($i = 0; $i < count($columnArray); $i++) {
            if($i > 0)
                $entity .= ucfirst($field[$i]);
            else
                $entity = $field[$i];
        }
        
        return $entity;

    }

    /**
     * Prende in input un entity (che rappresenta i campi della tabella che si vogliono estarre) e il nome della tabella.
     * $entity
     * $table contiene il nome della tabella di riferimento
     */

    //TODO Trasformare il nome della tabella in campo opzionale e fare in modo che
    // la query possa gestire più tabelle in natural join

    public function genericSelect($entity, $table) {

        $risultatoArray = array();

        $query = "select id, ";
        $select = "";
        $from = " from ".$table;
        $where = "";
        if($entity->getId() != null)
            $where = " where id = ".$entity->getId();

        $reflect = new ReflectionClass($entity);
        $props   = $reflect->getProperties(ReflectionProperty::IS_PRIVATE);

        foreach ($props as $prop) {
            $propertyName = $prop->getName();
            $propertyValue = null;
            //Estraggo il nome della colonna
            if($select != "")
                $select .= ",";

            $select .= " ".$this->splitAndCombineAtUpperCase($propertyName);

            //Individuo il valore della property
            $methodName = 'get' . ucfirst($propertyName);
            if (method_exists($entity, $methodName)) {

                $reflection_method = $reflect->getMethod("$methodName");
                $reflection_method->setAccessible(true);
                $result = $reflection_method->invoke($entity, NULL);

            } elseif (isset($entity->{$propertyName})) {
                $propertyValue = $this->{$propertyName};
                
            }
            //Se il valore individuato non è nullo, ne setto il valore
             if($propertyValue != null) {
                    if($where != "")
                        $where .= " AND ";
                    else
                        $where .= " where ";

                    if(is_string($value))
                        $value = "'".$value."'";

                    $where .= $column." = ".$value;

            }

        }

        $query .= $select. $from. $where;
        return $query;
        
    }

}
/*
$user = new User();
$user->setId(1);

$user->setNome("Fabio");

$dao = new DaoFactoryCreateQuery();
echo "Qui  ";
echo $dao->genericSelect($user, 'user');
*/
?>
